home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / SERVER / ServerConnection.C < prev    next >
C/C++ Source or Header  |  1990-12-06  |  5KB  |  288 lines

  1. #include <stdio.h>
  2.  
  3. #include "ServerConnection.h"
  4. #include "ServerPort.h" 
  5. #include "Error.h"
  6. #include "String.h"
  7. #include "SUNOS/sunsystem.h"
  8. #include "SUNWINDOW/sunsockets.h"
  9.  
  10. extern "C" int close(int);
  11.  
  12. ServerConnection *gConnection;
  13.  
  14. static char *cSendErrorMsg= "ServerConnection::SendMsg";
  15.  
  16. ServerConnection::ServerConnection() : SysEvtHandler(0)
  17. {
  18.     ifp= ofp= 0;
  19.     sequence= 4711;
  20.     
  21.     sock= ConnectService(SERVERNAME, SERVICENAME);
  22.     if (sock >= 0) {
  23.     ifp= fdopen(sock, "r");
  24.     ofp= fdopen(sock, "w");
  25.     }
  26.     SetResourceId(sock);
  27. }
  28.  
  29. bool ServerConnection::HasInterest()
  30. {
  31.     Flush();
  32.     return TRUE;
  33. }
  34.  
  35. void ServerConnection::Notify(SysEventCodes, int)
  36. {
  37.     Response rp;
  38.     
  39.     while (!SafeRead(&rp, 0, FALSE))
  40.     if (rp.port)
  41.         rp.port->ServerSend(&rp.t);
  42. }
  43.  
  44. void ServerConnection::Flush()
  45. {
  46.     if (ofp)
  47.     fflush(ofp);
  48. }
  49.  
  50. void ServerConnection::Close()
  51. {
  52.     if (ofp && ifp) {
  53.     if (ofp) {
  54.         fflush(ofp);
  55.         fclose(ofp);
  56.     }
  57.     if (ifp)
  58.         fclose(ifp);
  59.     ::close(sock);
  60.     Remove();
  61.     }
  62. }
  63.  
  64. bool ServerConnection::SafeRead(Response *b, int timeout, bool overread)
  65. {
  66.     for (;;) {
  67.     if (ofp)
  68.         fflush(ofp);
  69.         
  70.     b->port= 0;
  71.     if (overread) {
  72.         bool first= TRUE;
  73.         timeout= 0;
  74.         do {
  75.         if (myread(ifp, timeout, b, sizeof(struct Response)))
  76.             break;
  77.         first= FALSE;
  78.         } while (b->t.Code == eEvtLocMove);
  79.         if (first)
  80.         return TRUE;
  81.     } else if (myread(ifp, timeout, b, sizeof(struct Response)))
  82.         return TRUE;
  83.         
  84.     if (b->port) {
  85.         if (b->t.Code == eEvtDamage) {
  86.         b->port->ServerSend(&b->t);
  87.         continue;
  88.         }
  89.         return FALSE;
  90.     }
  91.     if (b->t.Pos.x > 0) {
  92.         b->t.At= (int) new byte[b->t.Pos.x];
  93.         fread((char*)b->t.At, b->t.Pos.x, 1, ifp);
  94.     }
  95.     return FALSE;
  96.     }
  97. }
  98.  
  99. //-------------------------------------------------------------------------------
  100.  
  101. /*
  102.  i  integer                    integer
  103.  s  short                      short
  104.  p  Point                      Point*
  105.  r  Rectangle                  Rectangle*
  106.  b  byte string                int, byte*
  107. */
  108.  
  109. void ServerConnection::SendMsg(int tag, int ref, char *va_(format), ...)
  110. {
  111.     register char c, *fmt;
  112.     short s, *sp;
  113.     byte *bs= 0;
  114.     Point *pp;
  115.     int i, *ip, bl, intCnt= 0, shortCnt= 0, pointCnt= 0, rectCnt= 0;
  116.     Rectangle *rp;
  117.     Message m;
  118.     Response resp;
  119.     va_list ap;
  120.     
  121.     va_start(ap,va_(format));
  122.     fmt= va_(format);
  123.     
  124.     m.tag= tag;
  125.     m.id= ref;
  126.     m.seq= sequence;
  127.     if (fmt == 0) {
  128.     if (fwrite((char*) &m, sizeof(Message), 1, ofp) == 0) 
  129.         SysError(cSendErrorMsg, "fwrite");
  130.     goto out2; 
  131.     }
  132.     
  133.     while (c= *fmt++) {
  134.     switch (c) {
  135.     case 's':               // short
  136.         s= va_arg(ap, int);
  137.         switch (shortCnt) {
  138.         case 0:
  139.         m.s1= s;
  140.         break;
  141.         case 1:
  142.         m.s2= s;
  143.         break;
  144.         case 2:
  145.         m.s3= s;
  146.         break;
  147.         default:
  148.         Error(cSendErrorMsg, "no more shorts");
  149.         break;
  150.         }
  151.         shortCnt++;
  152.         break;
  153.     case 'i':               // int
  154.         i= va_arg(ap, int);
  155.         switch (intCnt) {
  156.         case 0:
  157.         m.i1= i;
  158.         break;
  159.         default:
  160.         Error(cSendErrorMsg, "no more ints");
  161.         break;
  162.         }
  163.         intCnt++;
  164.         break;
  165.     case 'p':               // Point
  166.         pp= va_arg(ap, Point*);
  167.         switch (pointCnt) {
  168.         case 0:
  169.         m.p1= *pp;
  170.         break;
  171.         case 1:
  172.         m.p2= *pp;
  173.         break;
  174.         default:
  175.         Error(cSendErrorMsg, "no more points");
  176.         break;
  177.         }
  178.         pointCnt++;
  179.         break;
  180.     case 'r':               // Rectangle
  181.         rp= va_arg(ap, Rectangle*);
  182.         switch (rectCnt) {
  183.         case 0:
  184.         m.r1= *rp;
  185.         break;
  186.         default:
  187.         Error(cSendErrorMsg, "no more rectangles");
  188.         break;
  189.         }
  190.         rectCnt++;
  191.         break;
  192.     case 'b':               // byte*
  193.         bl= va_arg(ap, int);
  194.         bs= va_arg(ap, byte*);
  195.         switch (shortCnt) {
  196.         case 0:
  197.         m.s1= bl;
  198.         break;
  199.         case 1:
  200.         m.s2= bl;
  201.         break;
  202.         case 2:
  203.         m.s3= bl;
  204.         break;
  205.         default:
  206.         Error(cSendErrorMsg, "no more shorts");
  207.         break;
  208.         }
  209.         shortCnt++;
  210.         break;
  211.     case ' ':
  212.         break;
  213.     default:
  214.         if (c >= 'A' && c <= 'Z')
  215.         goto out;
  216.         Error("ServerConnection", "SendFmt");
  217.         break;
  218.     }
  219.     }
  220. out:
  221.     
  222.     if (fwrite((char*) &m, sizeof(Message), 1, ofp) == 0) 
  223.     SysError(cSendErrorMsg, "fwrite");
  224.     if (bs) {
  225.     int res= 0;
  226.     while (bl > 0) {
  227.         res= fwrite((char*) bs+res, 1, bl, ofp);
  228.         if (res == 0)
  229.         SysError(cSendErrorMsg, "fwrite");
  230.         bl-= res;
  231.     }
  232.     }
  233.     
  234.     if (c) {
  235.     for (;;) {
  236.         SafeRead(&resp, -1, FALSE); // block
  237.         if (resp.port)
  238.         ((ServerPort*)resp.port)->Enqueue(&resp);
  239.         else if (resp.t.Flags == sequence)
  240.         break;
  241.     }
  242.  
  243.     do {
  244.         switch (c) {
  245.         case 'S':               // short
  246.         sp= (short*) va_arg(ap, int*);
  247.         *sp= resp.t.Code;
  248.         break;
  249.         case 'I':               // int
  250.         ip= va_arg(ap, int*);
  251.         *ip= resp.t.Code;
  252.         break;
  253.         case 'P':               // Point
  254.         pp= va_arg(ap, Point*);
  255.         *pp= resp.t.Pos;
  256.         break;
  257.         case 'R':               // Rectangle
  258.         rp= va_arg(ap, Rectangle*);
  259.         break;
  260.         case 'B':               // byte*
  261.         bl= va_arg(ap, int);
  262.         bs= va_arg(ap, byte*);
  263.         if (bl != resp.t.Pos.x)
  264.             Error(cSendErrorMsg, "diff in bytecnt");
  265.         bl= min(bl, resp.t.Pos.x);
  266.         if (resp.t.At) {
  267.             if (bl > 0)
  268.             BCOPY((byte*)resp.t.At, bs, bl);
  269.             delete (void*)resp.t.At;
  270.             resp.t.At= 0;
  271.         }
  272.         break;
  273.         case 'Z':
  274.         case 'Y':
  275.         case ' ':
  276.         break;
  277.         default:
  278.         Error("ServerConnection", "SendFmt");
  279.         break;
  280.         }
  281.     } while (c= *fmt++);
  282.     }
  283.     
  284. out2:
  285.     sequence++;
  286.     va_end(ap);
  287. }
  288.